home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / exe / mouse.c < prev    next >
C/C++ Source or Header  |  2004-09-07  |  8KB  |  313 lines

  1. /*-------------------------------------------------------------
  2.   mouse.c : mouse clicks
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tclock.h"
  10. #include "../common/command.h"
  11.  
  12. /* Globals */
  13.  
  14. void InitMouseFunction(HWND hwnd);
  15. void EndMouseFunction(HWND hwnd);
  16. void OnMouseDown(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  17. void OnMouseUp(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  18. void OnTimerMouse(HWND hwnd);
  19.  
  20. /* Statics */
  21.  
  22. static void ExecuteMouseFunction(HWND hwnd, const PMOUSESTRUCT pMSS);
  23. static PMOUSESTRUCT GetMouseCommand(int button, int nclick);
  24.  
  25. static char *m_section = "Mouse";
  26. static DWORD m_tickLast;
  27. static int  m_nClick = 0;       // clicking count
  28. static int  m_nButton = -1;     // last clicked button
  29. static BOOL m_bUpDown = FALSE;  // last message is up/down
  30. static BOOL m_bTimer = FALSE;
  31. static UINT m_msecDoubleClick;
  32. static BOOL m_bStartMenuFromClock;
  33. static BOOL m_bRClickMenu = FALSE;
  34.  
  35. static PMOUSESTRUCT m_pMouseCommand = NULL;
  36. static int m_numMouseCommand = 0;
  37.  
  38. /*------------------------------------------------
  39.   initialize
  40. --------------------------------------------------*/
  41. void InitMouseFunction(HWND hwnd)
  42. {
  43.     char s[10];
  44.     
  45.     m_tickLast = GetTickCount();
  46.     
  47.     // Mouse double click speed
  48.     GetMyRegStr(m_section, "DoubleClickSpeed", s, 10, "");
  49.     if(s[0]) m_msecDoubleClick = atoi(s);
  50.     else     m_msecDoubleClick = GetDoubleClickTime();
  51.     
  52.     m_bStartMenuFromClock = GetMyRegLong("StartButton", "Hide", FALSE);
  53.     if(m_bStartMenuFromClock)
  54.         m_bStartMenuFromClock = 
  55.             GetMyRegLong("StartButton", "StartMenuClock", FALSE);
  56.     
  57.     m_bRClickMenu = GetMyRegLong(NULL, "RightClickMenu", TRUE);
  58.     m_bRClickMenu = GetMyRegLong(m_section, "RightClickMenu", m_bRClickMenu);
  59.     
  60.     if(GetMyRegLong(m_section, "ver031031", 0) == 0 ||
  61.         GetMyRegLong(m_section, "ver230", 0))
  62.     {
  63.         SetMyRegLong(m_section, "ver031031", 1);
  64.         ImportOldMouseFunc(); // common/mousestruct.c
  65.         DelMyReg(m_section, "ver230");
  66.     }
  67.     
  68.     if(m_pMouseCommand) free(m_pMouseCommand);
  69.     m_pMouseCommand = NULL;
  70.     
  71.     m_numMouseCommand = GetMyRegLong(m_section, "MouseNum", 0);
  72.     
  73.     if(m_numMouseCommand > 0)
  74.     {
  75.         m_pMouseCommand = malloc(sizeof(MOUSESTRUCT) * m_numMouseCommand);
  76.         // common/mousestruct.c
  77.         LoadMouseFunc(m_pMouseCommand, m_numMouseCommand);
  78.     }
  79. }
  80.  
  81. /*------------------------------------------------
  82.    clean up
  83. --------------------------------------------------*/
  84. void EndMouseFunction(HWND hwnd)
  85. {
  86.     if(m_bTimer) KillTimer(hwnd, IDTIMER_MOUSE);
  87.     m_bTimer = FALSE;
  88.     
  89.     if(m_pMouseCommand) free(m_pMouseCommand);
  90.     m_pMouseCommand = NULL;
  91. }
  92.  
  93. /*------------------------------------------------------------
  94.    when mouse button is down on the clock
  95. --------------------------------------------------------------*/
  96. void OnMouseDown(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  97. {
  98.     int button;
  99.     int i;
  100.     PMOUSESTRUCT pMSS;
  101.     BOOL bMoreClick;
  102.     
  103.     if(m_bTimer) KillTimer(hwnd, IDTIMER_MOUSE);
  104.     m_bTimer = FALSE;
  105.     
  106.     if(message == WM_RBUTTONDOWN &&
  107.         (!m_pMouseCommand || m_bRClickMenu))
  108.     {
  109.         POINT pt;
  110.         GetCursorPos(&pt);
  111.         OnContextMenu(hwnd, NULL, pt.x, pt.y);
  112.         return;
  113.     }
  114.     
  115.     if(!m_pMouseCommand) return;
  116.     
  117.     if(message == WM_LBUTTONDOWN && m_bStartMenuFromClock)
  118.         return;
  119.     
  120.     if(message == WM_LBUTTONDOWN)      button = 0;
  121.     else if(message == WM_RBUTTONDOWN) button = 1;
  122.     else if(message == WM_MBUTTONDOWN) button = 2;
  123.     else if(message == WM_XBUTTONDOWN)
  124.     {
  125.         if(HIWORD(wParam) == XBUTTON1) button = 3;
  126.         else if(HIWORD(wParam) == XBUTTON2) button = 4;
  127.         else return;
  128.     }
  129.     else return;
  130.     
  131.     if(m_nButton != button || m_bUpDown != FALSE)
  132.         m_nClick = 0;
  133.     
  134.     m_nButton = button;
  135.     m_bUpDown = TRUE;
  136.     
  137.     if(GetTickCount() - m_tickLast > m_msecDoubleClick)
  138.         m_nClick = 0;
  139.     m_tickLast = GetTickCount();
  140.     
  141.     pMSS = GetMouseCommand(button, m_nClick + 1);
  142.     if(!pMSS || pMSS->nCommand == IDC_SCREENSAVER
  143.         || pMSS->nCommand == IDC_MONOFF)
  144.         return;
  145.     
  146.     bMoreClick = FALSE;
  147.     for(i = m_nClick + 2; i <= 4; i++)
  148.     {
  149.         if(GetMouseCommand(button, i))
  150.         {
  151.             bMoreClick = TRUE; break;
  152.         }
  153.     }
  154.     
  155.     if(!bMoreClick)
  156.     {
  157.         m_nClick++;
  158.         ExecuteMouseFunction(hwnd, pMSS);
  159.     }
  160. }
  161.  
  162. /*------------------------------------------------------------
  163.    when mouse button is up on the clock
  164. --------------------------------------------------------------*/
  165. void OnMouseUp(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  166. {
  167.     int button;
  168.     int i;
  169.     PMOUSESTRUCT pMSS;
  170.     BOOL bMoreClick;
  171.     
  172.     if(m_bTimer) KillTimer(hwnd, IDTIMER_MOUSE);
  173.     m_bTimer = FALSE;
  174.     
  175.     if(!m_pMouseCommand) return;
  176.     
  177.     if(message == WM_LBUTTONUP && m_bStartMenuFromClock)
  178.         return;
  179.     
  180.     if(message == WM_LBUTTONUP)      button = 0;
  181.     else if(message == WM_RBUTTONUP) button = 1;
  182.     else if(message == WM_MBUTTONUP) button = 2;
  183.     else if(message == WM_XBUTTONUP)
  184.     {
  185.         if(HIWORD(wParam) == XBUTTON1) button = 3;
  186.         else if(HIWORD(wParam) == XBUTTON2) button = 4;
  187.         else return;
  188.     }
  189.     else return;
  190.     
  191.     if((m_nClick > 0 && m_nButton != button) || m_bUpDown != TRUE)
  192.     {
  193.         m_nClick = 0; m_nButton = -1; m_bUpDown = FALSE;
  194.         return;
  195.     }
  196.     
  197.     m_nButton = button;
  198.     m_bUpDown = FALSE;
  199.     
  200.     if(GetTickCount() - m_tickLast > m_msecDoubleClick)
  201.         m_nClick = 0;
  202.     m_tickLast = GetTickCount();
  203.     
  204.     m_nClick++;
  205.     
  206.     pMSS = GetMouseCommand(button, m_nClick);
  207.     if(!pMSS) return;
  208.     
  209.     bMoreClick = FALSE;
  210.     for(i = m_nClick + 1; i <= 4; i++)
  211.     {
  212.         if(GetMouseCommand(button, i))
  213.         {
  214.             bMoreClick = TRUE; break;
  215.         }
  216.     }
  217.     
  218.     if(bMoreClick)
  219.     {
  220.         m_bTimer = TRUE;
  221.         SetTimer(hwnd, IDTIMER_MOUSE, m_msecDoubleClick, 0);
  222.     }
  223.     else
  224.         ExecuteMouseFunction(hwnd, pMSS);
  225. }
  226.  
  227. /*------------------------------------------------
  228.    execute mouse function
  229. --------------------------------------------------*/
  230. void OnTimerMouse(HWND hwnd)
  231. {
  232.     PMOUSESTRUCT pMSS;
  233.     
  234.     if(!m_pMouseCommand) return;
  235.     
  236.     if(m_bTimer) KillTimer(hwnd, IDTIMER_MOUSE);
  237.     m_bTimer = FALSE;
  238.     
  239.     pMSS = GetMouseCommand(m_nButton, m_nClick);
  240.     if(pMSS) ExecuteMouseFunction(hwnd, pMSS);
  241. }
  242.  
  243. /*------------------------------------------------
  244.    execute mouse function
  245. --------------------------------------------------*/
  246. void ExecuteMouseFunction(HWND hwnd, const PMOUSESTRUCT pMSS)
  247. {
  248.     m_nClick = 0; m_nButton = -1; m_bUpDown = FALSE;
  249.     
  250.     switch (pMSS->nCommand)
  251.     {
  252.         case IDC_OPENFILE:
  253.             if(pMSS->option[0])
  254.             {
  255.                 SetFocusTClockMain(hwnd);
  256.                 ExecCommandString(hwnd, pMSS->option);
  257.             }
  258.             break;
  259.         case IDC_MOUSECOPY:
  260.             if(pMSS->option[0]) CopyToClipBoard(hwnd, pMSS->option);
  261.             break;
  262.         case IDC_MONOFF:
  263.         {
  264.             int delay = atoi(pMSS->option);
  265.             if (delay == 0)
  266.                 SendMessage(GetDesktopWindow(), WM_SYSCOMMAND,
  267.                     SC_MONITORPOWER, 2);
  268.             else
  269.                 SetTimer(hwnd, IDTIMER_MONOFF, delay * 1000, NULL);
  270.             break;
  271.         }
  272.         case IDC_COMMAND:
  273.         {
  274.             int nCmd = atoi(pMSS->option);
  275.             if(nCmd > 100) PostMessage(hwnd, WM_COMMAND, nCmd, 0);
  276.             break;
  277.         }
  278.         case IDC_FILELIST:
  279.             break;
  280.         default:
  281.             PostMessage(hwnd, WM_COMMAND, pMSS->nCommand, 0);
  282.             break;
  283.     }
  284. }
  285.  
  286. /*------------------------------------------------
  287.   retrieve mouse command
  288. --------------------------------------------------*/
  289. PMOUSESTRUCT GetMouseCommand(int button, int nclick)
  290. {
  291.     PMOUSESTRUCT pMSS;
  292.     BOOL bCtrl, bShift, bAlt;
  293.     int i;
  294.     
  295.     if(!m_pMouseCommand) return NULL;
  296.     
  297.     bCtrl  = GetAsyncKeyState(VK_CONTROL) ? TRUE : FALSE;
  298.     bShift = GetAsyncKeyState(VK_SHIFT)   ? TRUE : FALSE;
  299.     bAlt   = GetAsyncKeyState(VK_MENU)    ? TRUE : FALSE;
  300.     
  301.     pMSS = m_pMouseCommand;
  302.     for(i = 0; i < m_numMouseCommand; i++)
  303.     {
  304.         if(pMSS->nButton == button && pMSS->nClick == nclick &&
  305.             pMSS->bCtrl == bCtrl && pMSS->bShift == bShift &&
  306.             pMSS->bAlt == bAlt)
  307.             return pMSS;
  308.         pMSS++;
  309.     }
  310.     return NULL;
  311. }
  312.  
  313.